/* 
 * File:   Parser.cpp
 * Author: nicolas
 * 
 * Created on 28 de octubre de 2012, 16:51
 */
#include "Parser_1.h"
#include "registroMatrizInicial.h"

using namespace std;

bool compararRegistros(registroMatrizInicial *reg1, registroMatrizInicial *reg2){
    if(reg1->getTermino() < reg2->getTermino())
        return true;
    else if (reg1->getTermino() == reg2->getTermino() and reg1->getNroDocumento() < reg2->getNroDocumento())
        return true;
    
    return false;
}

Parser::Parser(std::string nombre_repositorio, std::string directorio){
    //this->repositorio = repositorio   //esto va
    //this->directorioAindexar = directorio //esto va
    this->repositorio = ""; //esto no va
    this->directorioAindexar = "/home/nicolas/Documentos/repositorio/"; //esto no va
}

Parser::Parser(const Parser& orig) {
}

registroMatrizInicial* Parser::noExisteRegistro(registroMatrizInicial & reg){
       list<registroMatrizInicial*>::iterator it ;
       
       it = l_palabras.begin();
       for(; it != l_palabras.end(); it++){
           //cout << "comparando " << (*it)->getTermino() << "con "<< (reg).getTermino() <<endl;
           if (*(*it) == reg )
               return (*it);
        }
        return NULL;
 }

Parser::~Parser() {
}

int Parser::crearParticiones(){
    int tamanioParticion = 0;
    int nro_doc = 1;
    fstream in;
    unsigned char IS_FILE = 0x8;
    DIR * dir;
    struct dirent * infoArch;
    char letra;
    
    if ((dir = opendir(this->directorioAindexar.c_str())) != NULL){
        rewinddir(dir);
        infoArch = readdir(dir);
        
        while(infoArch->d_name != NULL) {
            
            if(strstr(infoArch->d_name,"~") == NULL && strstr(infoArch->d_name,"idx") == NULL){
            
                if (infoArch->d_type == IS_FILE){
                     std::string path = this->directorioAindexar;
                     path.append(infoArch->d_name);
                     in.open(path.c_str());
                    
                     if (in.is_open()) {
                            ParserMatrizExtendida parser;
                    
                            while (in.eof() == false /*&&  y hasta llenar particion*/ ){
                                in.get(letra);
                                int pos = 0;
                                string * res = parser.ingresarNuevaLetra(letra);
                            
                                if (res != NULL) {
                                    //cout << "salida es: " << *res << endl;
                                    registroMatrizInicial *reg_datos = new registroMatrizInicial(nro_doc, 1/*frecuency*/, *res );
                                    //habria que ver si existe el registro, si existe reg en DOC sumar frcuencia, sino agregar
                                    registroMatrizInicial * reg_buscado = noExisteRegistro(*reg_datos);
                                 
                                    if (reg_buscado == NULL){
                                       // cout << "no estaba, agrego " << reg_datos->getTermino() << endl;
                                        l_palabras.push_back(reg_datos);
                                        tamanioParticion = registroMatrizInicial::tamanioRegistro(*reg_datos);
                                    }
                                    else {
                                        //no se chequean aun los cambios de tamaño en los registros segun el nro de frecuencia
                                        delete reg_datos;
                                        reg_buscado->aumentarFrecuencia();
                                      //  cout << "estaba, lo agrego " << reg_buscado->getTermino() << endl;
                                        //if nuevo_Reg.frecuencia aumento tamanaño == guardar nuevo tamaño;
                                    }
                            
                                }
                                 pos++;
                            
                            }
                            //cout << "ultima palabra: " <<  (*parser.ultimaPalabra()) << endl;
                            in.close();
                            parser.limpiarParserMatriz();
                            nro_doc++;

                      }
                
                }
                else std::cout << "error al abrir el archivo, path incorrecto" << endl;
            
            }
            
            if ((infoArch = readdir(dir)) == NULL) break;
            else{ 
                cout << " Nombre del archivo " << infoArch->d_name << endl;
         
            }
      
       }
    closedir(dir);
    }
    
    //tengo las palabras en una lista, la ordeno y creo el indice'
    l_palabras.sort(compararRegistros);
    list<registroMatrizInicial*>::iterator it;
    it = l_palabras.begin();
    for(; it != l_palabras.end(); it++){
        cout << "TERMINO: " << (*it)->getTermino() 
             << " DOCUMENTO: "<< (*it)->getNroDocumento()
             << " FRECUENCIA: " <<(*it)->getFrecuencia()  <<endl;
      }

   return 0; 
}